/**
 * 8. 字符串转换整数 (atoi)
 * https://leetcode-cn.com/problems/string-to-integer-atoi/
 */
public class Solution_8 {
    public static void main(String[] args) {
//        String str = "42";  // output: 42
//        String str = "   -42";  // output: -42
//        String str = "4193 with words";  // output: 4193
        String str = "words and 987";  // output: 0
//        String str = "-91283472332";  // output: -2147483648
//        String str = "2147483646";  // output: 2147483646
//        String str = "2147483648";  // output: 2147483647
//        String str = "";  // output: 0
//        String str = "+0 123";  // output: 0
//        String str = "3.14159";  // output: 3

        int result = myAtoi(str);
        System.out.println(result);
    }

    public static int myAtoi(String s) {
        if (s == null || s.length() < 1) {
            return 0;
        }
        char[] arr = s.toCharArray();
        int res = 0;
        // 记录符号
        char opt = ' ';
        int i = 0;
        // 去除字符串前面的空格
        while (i < arr.length && arr[i] == ' ') {
            i++;
        }
        // 是否有符号，若有则记录符号
        if (i < arr.length && (arr[i] == '+' || arr[i] == '-')) {
            opt = arr[i];
            i++;
        }
        for (; i < arr.length; i++) {
            if (Character.isDigit(arr[i])) {
                // 判断加上该字符后，res 是否会溢出
                // int 最大值：2147483647，int 最小值：-2147483648
                if (res > Integer.MAX_VALUE / 10 ||
                        (res == Integer.MAX_VALUE / 10 && arr[i] > '7')) {
                    return opt == '-' ? Integer.MIN_VALUE : Integer.MAX_VALUE;
                }
                // 是数字时计算数值
                res = res * 10 + (arr[i] - '0');
            } else {
                // 其它情况下，无法进行有效转换。退出循环
                break;
            }
        }
        return opt == '-' ? -res : res;
    }
}